package it.patterns.creational.abstractfactory;

/**
 * Provide an interface for creating families of related or dependent objects
 * without specifying their concrete classes. Abstract Factory defers creation
 * of product objects to its Concrete Factory subclass (typically a singleton).
 * 
 * It isolates classes.
 * 
 * It makes exchanging product families easy.
 * 
 * It promotes consistency among products.
 * 
 * <ul>
 * <li>A system should be independent of how its products are created (typically
 * using factory method), composed and represented.</li>
 * <li>A system should be configured with one of multiple families of products.</li>
 * <li>You want to provide a class library of products, and you want to reveal
 * just their interfaces, not their implementations</li>
 * </ul>
 * 
 * <img src="AbstractFactory.jpg" alt="Pattern Structure"/>
 * 
 * @author Luca D'Onofrio
 * 
 * @category Creational Pattern
 * @see "Design Patterns - Element of Reusable Object Oriented Software (Gamma,Helm, Johnson, Vlissides)"
 * 
 * @version 1.0
 * 
 */
public interface AbstractFactory {

	public AbstractProduct createProduct();
}
